﻿#ifndef FD_CORE_STRINGARRAY_H
#define FD_CORE_STRINGARRAY_H
#pragma once
#include "kernel/OgrePlatform.h"
#include "kernel/Referenced.h"
#include "kernel/multibytestring.h"
#include "kernel/unicodestring.h"

namespace FD
{
	namespace Kernel
	{
		/// <summary>
		/// 类说明：字符串数组类，提供基本的数组相关操作
		/// </summary>
		class FD_Kernel_Export FdStringArray : public FD::Kernel::CReferenced
		{
		public:
			FdStringArray();
			~FdStringArray();

		public:
			/// <summary>
			/// 函数说明：获取字符串数组大小
			/// </summary>
			/// <returns>返回数组大小</returns>
			uint32 getCount();
			/// <summary>
			/// 函数说明：判断数组是否为空
			/// </summary>
			/// <returns>true为空，false为不空</returns>
			bool isEmpty();
			/// <summary>
			/// 函数说明：在数组尾部添加字符串
			/// </summary>
			/// <param name="strNewItem">新字符串项</param>
			/// <returns>返回插入后数组大小</returns>
			uint32 append(const FD::Kernel::FdMultiByteString &strNewItem);
			/// <summary>
			/// 函数说明：在设定的位置插入字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <param name="strNewItem">新字符串项</param>
			/// <returns></returns>
			void insertAt(uint32 index, const FD::Kernel::FdMultiByteString &strNewItem);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串</returns>
			FD::Kernel::FdMultiByteString getAt(uint32 index);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串(不拷贝)</returns>
			FD::Kernel::FdMultiByteString& at(uint32 index);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串(不拷贝)</returns>
			const FD::Kernel::FdMultiByteString& at(uint32 index) const;
			/// <summary>
			/// 函数说明：根据位置移除字符串项
			/// </summary>
			/// <param name="index">字符串位置</param>
			/// <returns></returns>
			void removeAt(uint32 index);
			/// <summary>
			/// 函数说明：移除数组中所有字符串
			/// </summary>
			/// <returns></returns>
			void removeAll();
			/// <summary>
			/// 函数说明：获取字符串数组大小
			/// </summary>
			/// <returns></returns>
			size_t size();
			/// <summary>
			/// 函数说明：重新定义空间
			/// </summary>
			/// <returns></returns>
			void resize( size_t newSize);
		private:
			std::vector<FD::Kernel::FdMultiByteString> m_strAry;
		};
		typedef FdStringArray FdStringArray;

		/// <summary>
		/// 类说明：宽字符串数组类，提供基本的数组相关操作
		/// </summary>
		class FD_Kernel_Export FdWStringArray : public FD::Kernel::CReferenced
		{
		public:
			FdWStringArray();
			~FdWStringArray();

		public:
			/// <summary>
			/// 函数说明：获取字符串数组大小
			/// </summary>
			/// <returns>返回数组大小</returns>
			uint32 getCount();
			/// <summary>
			/// 函数说明：判断数组是否为空
			/// </summary>
			/// <returns>true为空，false为不空</returns>
			bool isEmpty();
			/// <summary>
			/// 函数说明：在数组尾部添加字符串
			/// </summary>
			/// <param name="strNewItem">新字符串项</param>
			/// <returns>返回插入后数组大小</returns>
			uint32 append(const FD::Kernel::FdUnicodeString &strNewItem);
			/// <summary>
			/// 函数说明：在设定的位置插入字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <param name="strNewItem">新字符串项</param>
			/// <returns></returns>
			void insertAt(uint32 index, const FD::Kernel::FdUnicodeString &strNewItem);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串</returns>
			FD::Kernel::FdUnicodeString getAt(uint32 index);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串(不拷贝)</returns>
			FD::Kernel::FdUnicodeString& at(uint32 index);
			/// <summary>
			/// 函数说明：根据位置获取数组中的字符串
			/// </summary>
			/// <param name="index">新字符位置</param>
			/// <returns>返回的字符串(不拷贝)</returns>
			const FD::Kernel::FdUnicodeString& at(uint32 index) const;
			/// <summary>
			/// 函数说明：根据位置移除字符串项
			/// </summary>
			/// <param name="index">字符串位置</param>
			/// <returns></returns>
			void removeAt(uint32 index);
			/// <summary>
			/// 函数说明：移除数组中所有字符串
			/// </summary>
			/// <returns></returns>
			void removeAll();
			/// <summary>
			/// 函数说明：获取字符串数组大小
			/// </summary>
			/// <returns></returns>
			size_t size();
			/// <summary>
			/// 函数说明：重新定义空间
			/// </summary>
			/// <returns></returns>
			void resize( size_t newSize);
		private:
			std::vector<FD::Kernel::FdUnicodeString> m_strAry;       
		};
	}
}

#endif

